iT邦幫忙

2021 iThome 鐵人賽

DAY 18
0

Abstract

在一個廣大領域需求的市場,無論你身處哪種開發情境下,勢必都會遇到需要開發API進行介接的情況,目的在於將資訊呈現於前端介面上,或整合介接於各套系統上,故勢必會切割出各類各式的API,此種架構統稱為服務導向架構(SOA,Service-Oriented Architecture),本文章採用領域驅動設計(DDD,Domain Driven Design)設計方法進行實作,相關運用的元件在前面幾天已有進行詳細敘述,如何使開發者快速尋找到對應的服務、快速建立相關的服務及運用控制器(@RestController)達到基礎的新增、讀取、更新及刪除(CRUD,Create Read Update Delete)四項基本操作,有沒有一種開始想躍躍欲試感覺,現在讓我們開始跟你做介紹與說明吧!Let's Go~!!!

Principle Introduction

SOA架構至今依舊是相當盛行的架構,適用於各種場域上的系統設計,主要由三種基本元素組成,分別為元件、服務及流程三個部份,在這十幾天,我們已將達到這三種元素相關模式註解進行詳細介紹,亦介紹過相當多種模式註解來設計出不同的Bean元件、設計不同服務元件及修改流程註解模式,所有的應用程式接口(API)接來至於控制器(Controller),Spring框架亦有提供應用程式接口開發註解模式,分別為@RestController與@Controller兩種控制器模式註解,@Controller屬於一種元註解控制器模式註解,可適用於Socket與WebService服務開發,@RestController屬於WebService的模式註解,可以見得@RestController等於@ResponseBody及@Controller兩項註解搭配而成,@RestController因有@ResponseBody此項註解輔助,可以將模型實體自動返回格式轉成JSON(JavaScript Object Notation)格式,而@Controller需再多配置@ResponseBody此項註解才可達到效用,各位開發者可參考以下範例程式及測試結果,相關開發設計方法再由下面結構章節進行闡述。

範例一、@RestController範例程式碼,以內部配置@ResponseBody預設回覆內文格式註解。

@RestController
public class ProductController extends ControllerBase{
    @Resource(name="seaFoodRetailService",type = SeaFoodRetailService.class)
    SeaFoodRetailService seaFoodRetailService;

    @GetMapping(
            value="/taiwan/list"
    )
    List<SeaFood> listSeaFood() {
        return seaFoodRetailService.listSeaFoodProducts();

    }

    ..... 
    .....
    .....
    
 }

範例一、測試結果未配置任何回應格式註解自動轉為JSON格式

image

範例二、@Controller範例程式碼,並未配置上@ResponseBody回覆內文格式註解。

@Controller
public class ChinaProductController extends ControllerBase {

    @Resource(name="chinaSeaFoodRetailService",type = SeaFoodRetailService.class)
    SeaFoodRetailService seaFoodRetailService;

    @GetMapping(
            value="/china/list"
    )
    List<SeaFood> listSeaFood() {
        return seaFoodRetailService.listSeaFoodProducts();
    }
    
    .....
    .....
    .....
    
}

範例二、因沒有預設的回覆格式會導致回覆內容錯誤

image

補上@ResponseBody後即可回傳接取JSON預設格式,或在每個方法置放上{consumes = MediaType.APPLICATION_JSON_VALUE},這樣就會要求每個請求API在header中置放Content-type為application/json才可進行請求。
image

透過以上@Controller註解模式程式碼範例與規範給各位開發者作參考,亦可釐清個註解之間的差異處,範例檔中的postman.json提供給各位開發者做操作測試使用,各位開發者可以無聊玩玩看喔!

Structure

依據下圖(圖一),我們可看出Spring所有註解服務皆擴展於@Component元註解,並僅能運用在類別元件上,不可引用於方法上,是一個專為Restful API設計的註解模式,並配置上了預設的JSON回覆格式之註解模式(@ResponseBody)方法,而為何要將@Controller獨立切出呢,是因為這個控制器元註解(@Controller)亦有其他服務共用,如:RSocket Service,啊~可是這個時間不夠,小編沒規劃排在這三十天內,下方架構圖提供給各位開發者作參考。

圖一 RestController 繼承架構圖
image

依據下圖(圖二),我們可看出任何前端框架發送請求數據給後端服務時,皆採用HTTP方法居多,故我們提供了一個簡單範例用Cache來暫時取代ORM套件,由上至下的架構為@Controller、@Service、@Reporitory及@DataModel此四項,可由架構圖可看出亦可配置周遭相關服務去更新各領域的DataModel,如:@Scheduler,如此一來,各控制器可很快速地透過各式各樣的注入服務進行觸發執行任務,並取得介接元件或服務所需要的數據資料,即可讓前端介面進行界皆呈現。

圖二 Domain Driven Design架構圖
image

Sample Source

Spring-sample-controller

Reference Url

服務導向架構(Service-Oriented Architecture,SOA) 簡介

[Domain Driven Design] 簡介和為什麼你需要DDD


上一篇
[Day - 17 ] - Spring 導入選擇器原理與開發
下一篇
[Day - 19] - Spring 例外處理之優雅化客製化錯誤訊息原理與設計
系列文
Wow ! There is no doubt about Learn Spring framework in a month.30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言